package cn.tedu.gateway.filter;

import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBuffer;
import org.springframework.http.MediaType;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.nio.charset.StandardCharsets;
import java.util.function.Supplier;

@Component // 将当前类交给Spring管理
public class My01Filter implements GlobalFilter, Ordered {

    /**
     * ServerWebExchange exchange 获取请求的信息
     * GatewayFilterChain chain 获取下一个过滤器：
     * 在 Spring Cloud Gateway 中，GatewayFilterChain 代表过滤器链，它负责管理和执行一系列的网关过滤器（Gateway Filters）。具体来说：
     * 过滤器链管理：当你为网关配置了多个过滤器时，GatewayFilterChain 会按照顺序组织和执行这些过滤器。
     * 请求处理流程：当一个请求到达网关时，它会通过过滤器链中的每个过滤器，每个过滤器可以对请求进行修改、检查或执行其他逻辑。
     * 链式调用：在自定义过滤器中，你需要调用 chain.filter(exchange) 来将请求传递给下一个过滤器。如果不调用这个方法，请求就不会继续向下传递，可能导致请求无法到达目标服务。
     * 响应处理：过滤器链也处理响应，允许在响应返回给客户端之前对其进行修改
     * @param exchange
     * @param chain
     * @return
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        System.out.println("进入我的第一个过滤器");
        //响应相关处理API
        //1.获取响应的对象
        ServerHttpResponse response = exchange.getResponse();
        //2.拦截处理，准备一个响应信息，是一个JSON串
        String jsonData="{\"state\":200,\"message\":\"你被拦截了\",\"data\":null}";
        //设置响应的相关的配置信息
        response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
        //4.将jsonData转成字节数组类型，并且设置字符集为utf-8
        byte[] bytes = jsonData.getBytes(StandardCharsets.UTF_8);
        //5.将字节数组封装成缓冲流
        DataBuffer dataBuffer = response.bufferFactory().wrap(bytes);
        Mono<DataBuffer> dataBufferMono = Mono.fromSupplier(new Supplier<DataBuffer>() {
            @Override
            public DataBuffer get() {
                //将上面包装好的缓冲流返回
                return dataBuffer;
            }
        });
        return chain.filter(exchange);//让这个请求正常通过
    }

    @Override
    public int getOrder() {
        return 100;
    }
}
